home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / WindowSystem.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  7KB  |  296 lines

  1. //$WindowSystem,TimeoutHandler$
  2.  
  3. #include <stdio.h>
  4.  
  5. #include "WindowSystem.h"
  6. #include "String.h"
  7. #include "Error.h"
  8. #include "WindowPort.h"
  9. #include "ClipBoard.h"
  10. #include "DevBitmap.h"
  11.  
  12.  
  13. Rectangle       gScreenRect(0, 0, 1152, 900);
  14. bool            gWinInit= FALSE;
  15. WindowSystem    *gWindowSystem= 0;
  16. int             gDepth= 1;
  17. bool            gColor= FALSE;
  18. bool            forcemono;
  19.  
  20. static DevBitmap *LoadSunRasterfile(const char *name);
  21. static DevBitmap *LoadIconfile(const char *name);
  22.  
  23. //---- TimeoutHandler ----------------------------------------------------------
  24.  
  25. extern WindowPort *focusport;
  26. Point lastpos;
  27.  
  28. class TimeoutHandler : public SysEvtHandler {
  29. public:
  30.     TimeoutHandler() : SysEvtHandler(0)
  31.     { }
  32.     void Notify(SysEventCodes, int);
  33. };
  34.  
  35. void TimeoutHandler::Notify(SysEventCodes, int)
  36. {
  37.     Token t(eEvtIdle, eFlgNone, lastpos);
  38.     if (focusport)
  39.     focusport->SendInput(&t);
  40. }
  41.  
  42. //---- WindowSystem ------------------------------------------------------------
  43.  
  44. MetaImpl0(WindowSystem);
  45.  
  46. WindowSystem::WindowSystem(bool&, char *name) : SysEvtHandler(0)
  47. {
  48.     wsName= name;
  49. }
  50.  
  51. WindowSystem::~WindowSystem()
  52. {
  53.     gWinInit= FALSE;
  54.     SafeDelete(gFontManager);
  55. }
  56.  
  57. void WindowSystem::Init()
  58. {
  59.     if (forcemono)
  60.     gDepth= 1;
  61.     gColor= gDepth > 1;
  62.     
  63.     gFontManager= MakeFontManager(gEtDir);
  64.     if (gFontManager == 0)
  65.     Fatal("Init", "no font manager");
  66.  
  67.     if (gFontManager->Init())
  68.     Fatal("Init", "initialization of font manager failed");
  69.     
  70.     gInkManager= new InkManager();
  71.     gInkManager->Init();
  72.  
  73.     gSystem->AddTimeoutHandler(new TimeoutHandler);
  74. }
  75.  
  76. WindowPort *WindowSystem::MakeWindow(InpHandlerFun, void*, bool, bool, bool) 
  77. {
  78.     return 0;
  79. }
  80.  
  81. void WindowSystem::RemoveWindow(WindowPort*)
  82. {
  83. }
  84.  
  85. FontManager *WindowSystem::MakeFontManager(char*)
  86. {
  87.     return 0;
  88. }
  89.  
  90. DevBitmap *WindowSystem::MakeDevBitmap(Point, u_short*, u_short)
  91. {
  92.     return 0;
  93. }
  94.  
  95. DevBitmap *WindowSystem::LoadDevBitmap(const char *name)
  96. {
  97.     DevBitmap *dbm;
  98.     
  99.     if (dbm= LoadSunRasterfile(name))
  100.     return dbm;
  101.     if (dbm= LoadIconfile(name))
  102.     return dbm;
  103.     return 0;
  104. }
  105.  
  106. class ClipBoard *WindowSystem::MakeClipboard()
  107. {
  108.     return new ClipBoard;
  109. }
  110.  
  111. void WindowSystem::graphicDelay(u_int duration)
  112. {
  113.     Wait(duration);
  114. }
  115.  
  116. bool WindowSystem::interrupted()
  117. {
  118.     return FALSE;
  119. }
  120.  
  121. //---- portable Sun rasterfile load --------------------------------------------
  122.  
  123. struct rasterfile {
  124.     int     ras_magic;      /* magic number */
  125.     int     ras_width;      /* width (pixels) of image */
  126.     int     ras_height;     /* height (pixels) of image */
  127.     int     ras_depth;      /* depth (1, 8, or 24 bits) of pixel */
  128.     int     ras_length;     /* length (bytes) of image */
  129.     int     ras_type;       /* type of file; see RT_* below */
  130.     int     ras_maptype;    /* type of colormap; see RMT_* below */
  131.     int     ras_maplength;  /* length (bytes) of following map */
  132.     /* color map follows for ras_maplength bytes, followed by image */
  133. };
  134.  
  135. #define RAS_MAGIC       0x59a66a95
  136. #define RT_STANDARD     1       /* Raw pixrect image in 68000 byte order */
  137. #define RMT_EQUAL_RGB   1       /* red[ras_maplength/3],green[],blue[] */
  138.  
  139. static DevBitmap *LoadSunRasterfile(const char *name)
  140. {
  141.     DevBitmap *bm= 0;
  142.     FILE *fp;
  143.  
  144.     if (fp= fopen((char*) name, "r")) {
  145.     struct rasterfile ras;
  146.     
  147.     fread((char*) &ras, sizeof(struct rasterfile), 1, fp);
  148.     if (ras.ras_magic == RAS_MAGIC) {
  149.         int x, y;
  150.         bm= gWindowSystem->MakeDevBitmap(Point(ras.ras_width, ras.ras_height), 0, ras.ras_depth);
  151.         int spl= bm->ShortsPerLine();
  152.         
  153.         if (ras.ras_maptype == RMT_EQUAL_RGB) {
  154.         int l= ras.ras_maplength;
  155.         if (l > 0) {
  156.             bm->SetColormapSize(l);
  157.             char *t= new char[l];
  158.             fread(t, 1, l, fp);
  159.             l/= 3;
  160.             for (x= 0; x < l; x++)
  161.             bm->SetColormapEntry(x, t[x], t[x+l], t[x+2*l]);
  162.             delete t;
  163.         } else {
  164.             l= 256;
  165.             bm->SetColormapSize(l);
  166.             for (x= 0; x < l; x++)
  167.             bm->SetColormapEntry(x, x, x, x);
  168.         }
  169.         }
  170.         
  171.         for (y= 0; y < ras.ras_height; y++)
  172.         for (x= 0; x < spl*2; x++)
  173.             bm->SetByte(x, y, fgetc(fp));
  174.     }
  175.     fclose(fp);
  176.     }
  177.     return bm;
  178. }
  179.  
  180. //---- portable Sun & X11 icon load --------------------------------------------
  181.  
  182. static DevBitmap *LoadIconfile(const char *name)
  183. {
  184.     static byte *swapmap= 0;
  185.     
  186.     FILE *fp;
  187.     bool swapbits= FALSE;
  188.     int tmp, version= 1, width= 0, height= 0, depth= 1, bitsperitem= 16;
  189.     int b, x= 0, y= 0, bytesperline, bytesperitem,itemsperline, imbytesperline;
  190.     u_long mask, m, d;
  191.     char buf[200], token[100], c;
  192.     DevBitmap *dbm;
  193.     
  194.     if ((fp= fopen((char*) name, "r")) == 0)
  195.     return 0;
  196.     
  197.     while (fscanf(fp, "%s", buf) == 1) {
  198.     if (strcmp(buf, "#define") == 0) {
  199.         swapbits= TRUE;
  200.         if (fscanf(fp, "%s %d", token, &tmp) == 2) {
  201.         int l= strlen(token);
  202.         if (strcmp(&token[l-6], "_width") == 0) {
  203.             width= tmp;
  204.             continue;
  205.         }
  206.         if (strcmp(&token[l-7], "_height") == 0) {
  207.             height= tmp;
  208.             continue;
  209.         }
  210.         }
  211.     }
  212.     if (sscanf(buf, "Format_version=%d", &version) == 1)
  213.         continue;
  214.     if (sscanf(buf, "Width=%d", &width) == 1)
  215.         continue;
  216.     if (sscanf(buf, "Height=%d", &height) == 1)
  217.         continue;
  218.     if (sscanf(buf, "Depth=%d", &depth) == 1)
  219.         continue;
  220.     if (sscanf(buf, "Valid_bits_per_item=%d", &bitsperitem) == 1)
  221.         continue;
  222.     if (strcmp(buf, "char") == 0) {
  223.         bitsperitem= sizeof(char) * 8;
  224.         continue;
  225.     }
  226.     if (strcmp(buf, "short") == 0) {
  227.         bitsperitem= sizeof(short) * 8;
  228.         continue;
  229.     }
  230.     if (strcmp(buf, "int") == 0) {
  231.         bitsperitem= sizeof(int) * 8;
  232.         continue;
  233.     }
  234.     if (strcmp(buf, "*/") == 0)
  235.         break;
  236.     if (strcmp(buf, "{") == 0)
  237.         break;
  238.     }
  239.  
  240.     if (width <= 0 || height <= 0)
  241.     return 0;
  242.     
  243.     dbm= gWindowSystem->MakeDevBitmap(Point(width, height), 0, depth);
  244.     itemsperline= (width-1) / bitsperitem + 1;
  245.     bytesperitem= bitsperitem / 8;
  246.     bytesperline= itemsperline * bytesperitem;
  247.     mask= 0xff << (bytesperitem-1)*8;
  248.     imbytesperline= dbm->BytesPerLine();
  249.     
  250.     if (swapbits && swapmap == 0) {
  251.     int b;
  252.     swapmap= new byte[256];
  253.     for (int i= 0; i < 256; i++) {
  254.         b= 0;
  255.         if (i & 0x01)
  256.         b|= 0x80;
  257.         if (i & 0x02)
  258.         b|= 0x40;
  259.         if (i & 0x04)
  260.         b|= 0x20;
  261.         if (i & 0x08)
  262.         b|= 0x10;
  263.         if (i & 0x10)
  264.         b|= 0x08;
  265.         if (i & 0x20)
  266.         b|= 0x04;
  267.         if (i & 0x40)
  268.         b|= 0x02;
  269.         if (i & 0x80)
  270.         b|= 0x01;
  271.         swapmap[i]= b;
  272.     }
  273.     }
  274.     
  275.     while (fscanf(fp, "%i%c", &tmp, &c) >= 1) {
  276.     m= mask;
  277.     for (b= bytesperitem-1; b >= 0; b--) {
  278.         d= (tmp & m) >> (b*8);
  279.         m>>= 8;
  280.         if (x < imbytesperline && y < height) {
  281.         if (swapbits)
  282.             dbm->SetByte(x, y, (int) swapmap[d]);
  283.         else
  284.             dbm->SetByte(x, y, (int) d);
  285.         }
  286.         
  287.         x++;
  288.         if (x == bytesperline) {
  289.         x= 0;
  290.         y++;
  291.         }
  292.     }
  293.     }
  294.     return dbm;
  295. }
  296.